const express = require('express');
const cors = require('cors');
const path = require('path');
const routes = require('./routes');

// 创建Express应用
const app = express();
const PORT = process.env.PORT || 3001;

// 中间件
app.use(cors({
  origin: '*',
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true, limit: '10mb' }));

// 添加CORS预检请求处理
app.options('*', cors());

// 静态文件服务
app.use('/uploads', express.static(path.join(__dirname, 'public/uploads')));

// 提供前端测试页面
app.use(express.static(path.join(__dirname, '..')));

// 路由
app.get('/api', (req, res) => {
  res.json({
    success: true,
    message: '服务器运行正常',
    timestamp: new Date().toISOString()
  });
});

app.use('/api', routes);

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({
    success: false,
    message: '服务器内部错误',
    error: err.message
  });
});

// 定时清理任务
const setupCleanupTask = () => {
  console.log('设置文件自动清理任务');
  
  // 立即执行一次清理
  cleanupOldFiles();
  
  // 设置每天0点执行清理
  const scheduleNextCleanup = () => {
    const now = new Date();
    const nextMidnight = new Date(now);
    nextMidnight.setDate(now.getDate() + 1);
    nextMidnight.setHours(0, 0, 0, 0);
    
    const timeUntilMidnight = nextMidnight - now;
    console.log(`下次清理将在 ${nextMidnight.toLocaleString()} 执行，还有 ${Math.floor(timeUntilMidnight / 1000 / 60)} 分钟`);
    
    setTimeout(() => {
      cleanupOldFiles();
      scheduleNextCleanup(); // 设置下一次清理
    }, timeUntilMidnight);
  };
  
  scheduleNextCleanup();
};

// 清理超过12小时的文件
const cleanupOldFiles = () => {
  const fs = require('fs');
  const path = require('path');
  
  console.log('开始清理过期文件...');
  
  const uploadsDir = path.join(__dirname, 'public/uploads');
  
  // 确保目录存在
  if (!fs.existsSync(uploadsDir)) {
    console.log('上传目录不存在，无需清理');
    return;
  }
  
  // 获取当前时间
  const now = new Date();
  
  // 读取目录中的所有文件
  fs.readdir(uploadsDir, (err, files) => {
    if (err) {
      console.error('读取上传目录失败:', err);
      return;
    }
    
    console.log(`上传目录中共有 ${files.length} 个文件`);
    
    let deletedCount = 0;
    let errorCount = 0;
    
    // 遍历所有文件
    files.forEach(file => {
      const filePath = path.join(uploadsDir, file);
      
      // 获取文件状态
      fs.stat(filePath, (err, stats) => {
        if (err) {
          console.error(`获取文件状态失败: ${file}`, err);
          errorCount++;
          return;
        }
        
        // 计算文件年龄（小时）
        const fileAge = (now - stats.mtime) / 1000 / 60 / 60;
        
        // 如果文件超过12小时，则删除
        if (fileAge > 12) {
          fs.unlink(filePath, err => {
            if (err) {
              console.error(`删除文件失败: ${file}`, err);
              errorCount++;
            } else {
              console.log(`已删除过期文件: ${file} (${fileAge.toFixed(2)} 小时)`);
              deletedCount++;
            }
          });
        }
      });
    });
    
    // 输出清理结果
    setTimeout(() => {
      console.log(`文件清理完成，已删除 ${deletedCount} 个文件，失败 ${errorCount} 个`);
    }, 1000);
  });
};

// 启动服务器
app.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
  
  // 设置文件自动清理任务
  setupCleanupTask();
});
